#include "public_datas.h"

#define TAG "DATA"

const char *string_en_status[] = {
    "DISABLE",
    "ENABLE"};

const char *string_trig_level[] = {
    "LOW",
    "HIGH"};

// static const char *key_type_list[] = {
//     "KEY_TYPE_NONE",
//     "KEY_TYPE_433M",
//     "KEY_TYPE_433M_125K",
//     "KEY_TYPE_BLE",
// };

// static const char *control_list[] = {
//     "CONTROL_LOCK",
//     "CONTROL_UNLOCK",
//     "CONTROL_OPEN_WINDOW",
//     "CONTROL_CLOSE_WINDOW",
//     "CONTROL_OPEN_BACK_DOOR",
//     "CONTROL_CLOSE_BACK_DOOR",
//     "CONTROL_FIND_CAR",
// };

// static const char *key_btn_io_list[] = {
//     "BTN_LOCK",
//     "BTN_UNLOCK",
//     "BTN_BDOOR",
//     "BTN_USER",
// };

// static const char *key_btn_event_list[] = {
//     "CLICK",
//     "LONG_PRESS",
//     "DOUBLE_CLICK",
// };

// static const char *key_control_id_list[] = {
//     "KEY_LOCK",
//     "KEY_UNLOCK",
//     "KEY_OPEN_WINDOW",
//     "KEY_CLOSE_WINDOW",
//     "KEY_OPEN_BACK_DOOR",
//     "KEY_CLOSE_BACK_DOOR",
//     "KEY_FIND_CAR",
// };

static public_datas_t datas;
static eeprom_datas_t eeprom_bak;

public_datas_t *public_datas()
{
    return &datas;
}

static void sleep_chek_cb(void *arg, size_t len)
{
    if (memcmp(&datas.eeprom_datas, &eeprom_bak, sizeof(eeprom_bak)) != 0)
    {
        EEPROM_WRITE(0, &datas.eeprom_datas, sizeof(datas.eeprom_datas));
    }
}

void public_datas_init()
{
    memset(&datas, 0, sizeof(datas));

    EEPROM_READ(0, &datas.eeprom_datas, sizeof(datas.eeprom_datas));
    if (datas.eeprom_datas.version != DATA_VERSION)
    {
        if (DATA_VERSION > datas.eeprom_datas.version && (DATA_VERSION - datas.eeprom_datas.version) == 1) // 保留数据更新
        {
            esay_logi(TAG, "user datas update");
            uint8_t *p = (uint8_t *)&datas.eeprom_datas;
            memset(p + datas.eeprom_datas.size, 0, sizeof(datas.eeprom_datas) - datas.eeprom_datas.size);
        }
        else
        {
            esay_logi(TAG, "user datas factory");
            memset(&datas.eeprom_datas, 0, sizeof(datas.eeprom_datas));
        }

        datas.eeprom_datas.version = DATA_VERSION;
        datas.eeprom_datas.size = sizeof(datas.eeprom_datas);
        for (size_t i = 0; i < BLE_SNV_NUM; i++)
        {
            datas.eeprom_datas.ble_datas.ble_alive_rssi[i] = -90;
            datas.eeprom_datas.ble_datas.ble_near_rssi[i] = -50;
            datas.eeprom_datas.ble_datas.ble_far_rssi[i] = -70;
        }

        // for (size_t i = 0; i < 2; i++)
        // {
        //     for (size_t j = 0; j < 3; j++)
        //     {
        //         datas.eeprom_datas.ble_datas.rssi_loc_err_meter[i][j] = 3;
        //     }
        // }

        // datas.eeprom_datas.key_datas.key_click_ms = KEY_BTN_CLICK_TIME_MS;

        datas.eeprom_datas.key_datas.btn_control[KEY_EVENT_LOCK_ID].btn = KEY_BTN1;
        datas.eeprom_datas.key_datas.btn_control[KEY_EVENT_LOCK_ID].event = KEY_BTN_EVENT_CLICK;

        datas.eeprom_datas.key_datas.btn_control[KEY_EVENT_UNLOCK_ID].btn = KEY_BTN2;
        datas.eeprom_datas.key_datas.btn_control[KEY_EVENT_UNLOCK_ID].event = KEY_BTN_EVENT_CLICK;

        datas.eeprom_datas.key_datas.btn_control[KEY_EVENT_CLOSE_WINDOW_ID].btn = KEY_BTN1;
        datas.eeprom_datas.key_datas.btn_control[KEY_EVENT_CLOSE_WINDOW_ID].event = KEY_BTN_EVENT_LONG_PRESS;
        datas.eeprom_datas.key_datas.btn_control[KEY_EVENT_CLOSE_WINDOW_ID].press_time = 4;

        datas.eeprom_datas.key_datas.btn_control[KEY_EVENT_OPEN_WINDOW_ID].btn = KEY_BTN2;
        datas.eeprom_datas.key_datas.btn_control[KEY_EVENT_OPEN_WINDOW_ID].event = KEY_BTN_EVENT_LONG_PRESS;
        datas.eeprom_datas.key_datas.btn_control[KEY_EVENT_OPEN_WINDOW_ID].press_time = 4;

        datas.eeprom_datas.key_datas.btn_control[KEY_EVENT_OPEN_BACK_DOOR_ID].btn = KEY_BTN3;
        datas.eeprom_datas.key_datas.btn_control[KEY_EVENT_OPEN_BACK_DOOR_ID].event = KEY_BTN_EVENT_LONG_PRESS;
        datas.eeprom_datas.key_datas.btn_control[KEY_EVENT_OPEN_BACK_DOOR_ID].press_time = 3;

        datas.eeprom_datas.key_datas.btn_control[KEY_EVENT_CLOSE_BACK_DOOR_ID].btn = KEY_BTN3;
        datas.eeprom_datas.key_datas.btn_control[KEY_EVENT_CLOSE_BACK_DOOR_ID].event = KEY_BTN_EVENT_LONG_PRESS;
        datas.eeprom_datas.key_datas.btn_control[KEY_EVENT_CLOSE_BACK_DOOR_ID].press_time = 3;

        datas.eeprom_datas.key_datas.btn_control[KEY_EVENT_FIND_CAR_ID].btn = KEY_BTN1;
        datas.eeprom_datas.key_datas.btn_control[KEY_EVENT_FIND_CAR_ID].event = KEY_BTN_EVENT_DOUBLE_CLICK;

#if 0 // 写入固定参数

        uint8_t mac0[] = {0x99, 0x74, 0x0f, 0x30, 0x0d, 0xdc}; // KEY
        memcpy(datas.eeprom_datas.ble_datas.white_list_mac[0], mac0, 6);
        datas.eeprom_datas.ble_datas.near_control_mask[0] = CONTROL_ENABLE | CONTROL_UNLOCK;
        datas.eeprom_datas.ble_datas.far_control_mask[0] = CONTROL_ENABLE | CONTROL_LOCK;

        uint8_t mac1[] = {0x87, 0xe2, 0x20, 0x6a, 0xd3, 0xc4}; // LOC 1
        memcpy(datas.eeprom_datas.ble_datas.white_list_mac[1], mac1, 6);

        uint8_t mac2[] = {0x34, 0xcd, 0x20, 0x6a, 0xd3, 0xc4}; // LOC 2
        memcpy(datas.eeprom_datas.ble_datas.white_list_mac[2], mac2, 6);

        uint8_t mac3[] = {0xeb, 0x95, 0x36, 0x6a, 0xd3, 0xc4}; // LOC 3
        memcpy(datas.eeprom_datas.ble_datas.white_list_mac[3], mac3, 6);

        // datas.eeprom_datas.ble_datas.rssi_loc_list[0][0] = 1;
        // datas.eeprom_datas.ble_datas.rssi_loc_list[0][1] = 2;
        // datas.eeprom_datas.ble_datas.rssi_loc_list[0][2] = 3;

        // datas.eeprom_datas.ble_datas.rssi_loc_trig_pos[0][0] = 0;
        // datas.eeprom_datas.ble_datas.rssi_loc_trig_pos[0][1] = -3;

        // datas.eeprom_datas.ble_datas.rssi_loc_in_control_mask[0][0] = CONTROL_ENABLE | CONTROL_OPEN_BACK_DOOR;
        // datas.eeprom_datas.ble_datas.rssi_loc_out_control_mask[0][0] = CONTROL_ENABLE | CONTROL_CLOSE_BACK_DOOR;

#endif

        EEPROM_WRITE(0, &datas.eeprom_datas, sizeof(datas.eeprom_datas));
    }

    memcpy(&eeprom_bak, &datas.eeprom_datas, sizeof(eeprom_bak));

    esay_logi(TAG, "version | %d", datas.eeprom_datas.version);
    esay_logi(TAG, "datas size | %d", datas.eeprom_datas.size);

    topic_messenger_subscribe(NULL, "sleep", sleep_chek_cb);
}
